// 引入SqlSugar ORM相关命名空间
using SqlSugar;
// 引入数据验证相关命名空间
using System.ComponentModel.DataAnnotations;

namespace Rabbit3.Api.Models
{
    /// <summary>
    /// 溯源信息实体类 - 食品溯源系统的核心实体
    /// 记录食品从生产到销售全过程的溯源信息，包括商品基本信息、生产信息、完整度等
    /// </summary>
    [SugarTable("traceability_info")] // 指定数据库表名为 traceability_info
    public class TraceabilityInfo
    {
        /// <summary>
        /// 主键ID - 溯源信息的唯一标识
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] // 设置为主键且自增
        public int Id { get; set; }

        /// <summary>
        /// 商品名称 - 食品的名称，如"有机大米"、"绿色蔬菜"等
        /// </summary>
        [SugarColumn(ColumnDataType = "varchar(100)", IsNullable = false)] // 数据库字段类型为varchar(100)，不允许为空
        [Required(ErrorMessage = "商品名称不能为空")] // 验证：必填字段
        [StringLength(100, ErrorMessage = "商品名称长度不能超过100个字符")] // 验证：最大长度100字符
        public string ProductName { get; set; } = string.Empty;

        /// <summary>
        /// 生产批次 - 产品的生产批次号，用于区分不同批次的产品
        /// </summary>
        [SugarColumn(ColumnDataType = "varchar(20)", IsNullable = false)] // 数据库字段类型为varchar(20)，不允许为空
        [Required(ErrorMessage = "生产批次不能为空")] // 验证：必填字段
        [StringLength(20, ErrorMessage = "生产批次长度不能超过20个字符")] // 验证：最大长度20字符
        public string ProductionBatch { get; set; } = string.Empty;

        /// <summary>
        /// 保质期(天) - 产品从生产日期开始的有效期天数
        /// </summary>
        [SugarColumn(IsNullable = false)] // 数据库字段不允许为空
        [Required(ErrorMessage = "保质期不能为空")] // 验证：必填字段
        [Range(1, 3650, ErrorMessage = "保质期必须在1-3650天之间")] // 验证：范围1-3650天
        public int ShelfLifeDays { get; set; }

        /// <summary>
        /// 生产许可证号 - 生产企业的食品生产许可证编号
        /// </summary>
        [SugarColumn(ColumnDataType = "varchar(50)", IsNullable = false)] // 数据库字段类型为varchar(50)，不允许为空
        [Required(ErrorMessage = "生产许可证号不能为空")] // 验证：必填字段
        [StringLength(50, ErrorMessage = "生产许可证号长度不能超过50个字符")] // 验证：最大长度50字符
        public string ProductionLicenseNumber { get; set; } = string.Empty;

        /// <summary>
        /// 生产企业 - 生产该产品的企业名称
        /// </summary>
        [SugarColumn(ColumnDataType = "varchar(200)", IsNullable = false)] // 数据库字段类型为varchar(200)，不允许为空
        [Required(ErrorMessage = "生产企业不能为空")] // 验证：必填字段
        [StringLength(200, ErrorMessage = "生产企业名称长度不能超过200个字符")] // 验证：最大长度200字符
        public string ProductionEnterprise { get; set; } = string.Empty;

        /// <summary>
        /// 封面图URL - 产品封面图片的URL地址，用于展示
        /// </summary>
        [SugarColumn(ColumnDataType = "varchar(500)", IsNullable = true)] // 数据库字段类型为varchar(500)，允许为空
        [StringLength(500, ErrorMessage = "封面图URL长度不能超过500个字符")] // 验证：最大长度500字符
        public string? CoverImageUrl { get; set; }

        /// <summary>
        /// 信息完善度百分比 - 溯源信息的完整程度，0-100之间的数值
        /// 基于各个阶段信息的完整性计算得出
        /// </summary>
        [SugarColumn(IsNullable = false)] // 数据库字段不允许为空
        [Range(0, 100, ErrorMessage = "信息完善度必须在0-100之间")] // 验证：范围0-100
        public int InformationCompleteness { get; set; } = 0;

        /// <summary>
        /// 溯源码 - 用于生成二维码或条形码的唯一标识码
        /// </summary>
        [SugarColumn(ColumnDataType = "varchar(50)", IsNullable = true)] // 数据库字段类型为varchar(50)，允许为空
        [StringLength(50, ErrorMessage = "溯源码长度不能超过50个字符")] // 验证：最大长度50字符
        public string? TraceabilityCode { get; set; }

        /// <summary>
        /// 创建时间 - 记录创建的时间戳
        /// </summary>
        [SugarColumn(IsNullable = false)] // 数据库字段不允许为空
        public DateTime CreatedAt { get; set; } = DateTime.Now;

        /// <summary>
        /// 更新时间 - 记录最后更新的时间戳
        /// </summary>
        [SugarColumn(IsNullable = false)] // 数据库字段不允许为空
        public DateTime UpdatedAt { get; set; } = DateTime.Now;

        /// <summary>
        /// 是否删除 - 软删除标记，true表示已删除，false表示未删除
        /// </summary>
        [SugarColumn(IsNullable = false)] // 数据库字段不允许为空
        public bool IsDeleted { get; set; } = false;

        /// <summary>
        /// 创建人ID - 创建该记录的用户ID
        /// </summary>
        [SugarColumn(IsNullable = true)] // 数据库字段允许为空
        public int? CreatedBy { get; set; }

        /// <summary>
        /// 更新人ID - 最后更新该记录的用户ID
        /// </summary>
        [SugarColumn(IsNullable = true)] // 数据库字段允许为空
        public int? UpdatedBy { get; set; }
    }
}
